package com.example.concurrent.chapter10;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author Create By Liuqz
 * @date 2018/11/23 17:47
 */
public class MyClassLoaderTest {

    /**
     * 当一个类加载器调用loadClass之后的过程:
     * 1.从当前类加载器的已加载类缓存中根据类的全路径名查询是否存在该类,如果存在则直接返回
     * 2.如果当前类存在父类加载器,则调用父类加载器的loadClass(name,false)方法对其进行加载
     * 3.如果当前类加载器不存在父类加载器,则直接调用根类加载器对该类进行加载
     * 4.如果当前类的所有父类加载器都没有成功加载class,则尝试调用当前类加载器的findClass方法对其进行加载.该方法就是我们自定义加载器需要重写的方法
     * 5.最后如果类被成功加载了,则做一些性能数据的统计
     * 6.由于loadClass指定了resolve为false,所以不会进行连接阶段的继续执行,这也就解释了为什么通过类加载器加载类并不会导致类的初始化
     * @param args
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //声明一个MyClassLoader
        MyClassLoader classLoader = new MyClassLoader();

        //使用MyClassLoader加载HelloWorld
        Class<?> aClass = classLoader.loadClass("com.example.concurrent.chapter10.HelloWorld");

        System.out.println(aClass.getClassLoader());


        Object helloWorld = aClass.newInstance();
        System.out.println(helloWorld);
        Method welcomeMethod = aClass.getMethod("welcome");
        String result = (String) welcomeMethod.invoke(helloWorld);
        System.out.println("Result : " + result);

    }
}
